How to系列:在Hyper 您所在的位置:网站首页 windows 显卡 wddm 显存 How to系列:在Hyper

How to系列:在Hyper

2024-06-29 16:43| 来源: 网络整理| 查看: 265

其实这玩意很难描述……更通俗的玩法比如白嫖王为首的什么X人一机之类,还有什么显卡虚拟化、XX多开,虽然我只是为了让虚拟机别那么卡就是了……靠CPU渲染画面真是离谱╮(╯▽╰)╭

因为首先,Discrete Device Assignment(DDA)在巨硬的叫法里就很不吃人间烟火:离散设备分配。←一眼见就简直是什么鬼玩意……算了,算了,还是叫DDA吧。

注意,DDA不只是用于显卡,任何PCIe设备都可以通过DDA给虚拟机,包括NVMe SSD、PCIe网卡之类,只是毕竟有VirtIO之类还有又不是不能用等情况所以要求没有显卡那么迫切需要“直通”。

比如VMware、VBOX之类的显卡加速还有Unraid、ESXi之类显卡直通就不提了,说回Hyper-V,其实很早之前也是有显卡“直通”(打引号是因为其实只是加速而不是真·直通)的,称之为RemoteFX vGPU,后来从Windows Server 2016开始就被默认禁用了,取而代之的是DDA也就是离散设备分配,见这里。

其实对于目前(也就是写这玩意的2022年8月)来说,RemoteFX vGPU还是挺方便的,因为至少Hyper-V的UI有直接的操作,和DDA目前依旧依赖于PowerShell来说简单太多,而且不依赖SR-IOV之类的硬件需求。然而——这也有一个问题就是RemoteFX vGPU的驱动(指虚拟机层)是巨硬自己写的,为了兼容起见最高也就支持DX11.1、只有1G的虚拟显存、最高30fps的显示帧率……至于什么CUDA加速之类想都别想,现在来说的确也不够看了……

所以说抛开配置调参的困难和硬件要求不谈(……),DDA也有它的优势,比如因为设备是直通进去(也就是虚拟机直接到物理设备)所以驱动由硬件提供商提供基本等于纯物理设备的性能。简单来说就跟虚拟磁盘和直通存储、虚拟网卡和VirtIO甚至SR-IOV网卡的差别相当。

不过早期DDA只有独占模式,也就是说比如把插在物理机的A卡分配给虚拟机1,那么物理机以及别的虚拟机都无法使用A卡,只能加钱!插更多的卡给物理机或者别的虚拟机使用……这就离谱了朋友……虚拟化设备这么玩怎么提高密度和负载率?想想Quadro、GRID、FirePro都是一张卡虚拟成多卡去尽可能达成显卡是高负载输出工作而不是白白插着耗电摸鱼——于是后来DDA也有了共享模式,更后来nVIDIA, fu*k U!老黄也终于放开了GeForce显卡也可以虚拟机中使用而不是万恶的Code 43以后,DDA共享(巨硬的说法是GPU分区(???)有了更大的推进。

现在唯一的阻碍反倒是巨硬自己了——都Windows Server 2022了DDA还只能靠PowerShell去配参而且官方文档居然还只有独占模式的教程╮(╯▽╰)╭

这里放一段我今晚调试的PowerShell…… 注意: 1.这是我自己的调参草稿所以有不少其实与之无关的命令; 2.#是PowerShell的注释; 3.这个PowerShell脚本用于Hyper-V物理机上。

#https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/deploy/deploying-graphics-devices-using-dda

#设置要操作的虚拟机名字例如HV-Windows11-GPU* $vm = "HV-Windows11-GPU*"

#F8单行执行→移除DDA分区GPU #Remove-VMGpuPartitionAdapter -VMName $vm

#如果有多张显卡的时候获取GPU的路径,参考自:https://blog.shigure.fun/laptop_gpu_hyperv/ Get-VMHostPartitionableGpu

#检查SR-IOV(如果没有SR-IOV的,需要进BIOS启用SR-IOV或者IOMMU) (Get-VMHost).IovSupport; (Get-VMHost).IovSupportReasons

#如果像下面的图报错的话需要 F8单行执行 添加注册表用禁用SDA(SecureDeviceAssignment,安全设备分配 和 SupportedDeviceAssignment,支持的设备分配)检测,参考自 https://withinrafael.com/2020/06/06/how-to-get-consumer-gpus-working-in-hyperv-virtual-machines/ 和https://docs.microsoft.com/zh-cn/powershell/scripting/samples/working-with-registry-keys?view=powershell-7.2,不然的话可以跳过

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\HyperV] "RequireSecureDeviceAssignment"=dword:00000000 "RequireSupportedDeviceAssignment"=dword:00000000

#F8单行执行 如果要恢复原来或者说启用检测需要删除注册表相关项 #Remove-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\HyperV"

#关闭VM的自动停止操作,其实这个可以对应VM的设置GUI里设置 Set-VM -Name $vm -AutomaticStopAction TurnOff

#如果有多张显卡的话需要手动分配GPU的路径,这个对应上面的 Get-VMHostPartitionableGpu 也可以通过设备管理器直接查看显卡的详情 $gpupath="\\?\PCI#VEN_10DE&DEV_1287&SUBSYS_00000000&REV_A1#4&3a6d4ab7&0&0038#{064092b3-0000-0000-0000-dc845897dd59}\GPUPARAV" Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $gpupath

#设定GPU分区的参数,参考 https://docs.microsoft.com/zh-cn/windows/win32/hyperv_v2/msvm-partitionablegpu 如无意外这个可以照抄 Set-VM -GuestControlledCacheTypes $true -VMName $vm Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000

#32bitMMIO(Low) 和 64bitMMIO(High),分配GPU显存,参考 https://docs.microsoft.com/zh-cn/windows-server/virtualization/hyper-v/deploy/deploying-graphics-devices-using-dda#some-additional-vm-preparation-is-required-for-graphics-devices ,注意B和b的大小写,这个需要参考实际GPU的分区数(也就是一个物理GPU分配给多少个虚拟机,类似CPU核心分配)和物理显存的实际情况以及可以参考设备管理器对应显卡的内存范围,这里是结合我Kepler 730只有1GB显存的设定,具体计算参考 https://docs.microsoft.com/zh-cn/windows-server/virtualization/hyper-v/plan/plan-for-deploying-devices-using-discrete-device-assignment Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm Set-VM -HighMemoryMappedIoSpace 8GB -VMName $vm

这里也提供巨硬自己的PowerShell,可以用于检测设备以及参考设定MMIO数值:SurveyDDA.ps1 ← 注意脚本放在Github所以╮(╯▽╰)╭

另外上面我脚本提到SDA的报错就是这样: 如果顺利启动虚拟机没有报错那就可以不用动注册表了╮(╯▽╰)╭

理论上漫漫配参路走完,虚拟机顺利启动,你在虚拟机的设备管理器里看到了物理显卡显示就算走通了90%。然而这个时候大概率你看到的是对应的显卡一个黄色感叹号——因为没有驱动,而且大概率显示也是Code 43.(如果是N卡的话……

哎,不用慌,下面开始摆平驱动。 首先从物理机的C:\Windows\System32\DriverStore\FileRepository\提取驱动比如nv_dispsig.inf_amd64_207a6cc3059bae3d,注意由于驱动版本等等原因后面这串数字可能根本不一样,认准nv_dispsig就好,你也可以通过设备管理器一步跳到这里或者学我用DISM++直接导出驱动。 然后把这个nv_dispsig整个文件夹拷到虚拟机的C:\Windows\System32\HostDriverStore\FileRepository\,注意,需要手动新建HostDriverStore\FileRepository\文件夹。 最后重启~ 如无意外,重启后虚拟机里的显卡就可以摆脱感叹号和Code 43显示“这个设备运转正常。”了。

Anyway,注意一个就是,虚拟机其实是通过接口调用物理显卡(比如DirectX)而始终不是直接接触到物理显卡(比如你看虚拟机里显卡的位置就是Virtual PCI Bus而不是“传统”的PCI 插槽 1 (PCI 总线 1、设备 0、功能 0)。所以就目前短短的测试,CUDA/CUDNN我测试过是OK的(Waifu2x-Caffe/CUDA-Z),AIDA64也可以完整识别到D3D、CUDA、OpenCL的接口,然而GPGPU测试会卡住很久甚至报Not Support,GPU-Z直接一片空白。换言之,大概率软件或者游戏是能跑的但是涉及到硬件的测试估计就GG了,当然实际上游戏我也没测试,毕竟1G显存的Kepler 730,还能跑什么呢……

于是配参精简版(还是那句仅供参考,请结合实际调参: $vm = "HV-Win11GPU*" $gpupath="\\?\PCI#VEN_10DE&DEV_1287&SUBSYS_00000000&REV_A1#4&3a6d4ab7&0&0038#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV" Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $gpupath Set-VM -Name $vm -AutomaticStopAction TurnOff Set-VM -GuestControlledCacheTypes $true -VMName $vm Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000 Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm Set-VM -HighMemoryMappedIoSpace 8GB -VMName $vm

最后的最后,DDA其实也还是有它的限制,总结一下:

1.物理机需要Windows Server 2016以上(或者说相等的Windows 10 1809+)的Hyper-V;

2.物理机需要支持SR-IOV/IOMMU,不支持的话可能性能打折扣(比如我现在这样,R410(KSRoselia)是MarkⅠ,早期版本,需要R410的MarkⅡ的BIOS才有SR-IOV开关打开功能,所以我需要关闭SDA检测),服务器平台还好,消费级平台不确定视乎对应芯片组的功能以及厂商是否有这个开放;

3.显卡的话我这边目前只测试了老黄的N卡(Kepler),A卡没有但是看PCbeta至少HD7800都是OK的But也有反馈是A卡有可能会死机(……),具体来说其实强调是驱动需要支持WDDM 2.5以上的特性(具体来说是WDDM 2.4的“基于 IOMMU 的 GPU 隔离”),老黄最新的驱动是WDDM 2.9(在Windows 10/Windows Server 2022),Intel这边我看SKL的HD核显都还在WDDM 2.1大概率是寄了,UHD的核显手头没有所以╮(╯▽╰)╭

4.虚拟机的系统大概也是需要Windows和物理机类似版本(或者换句话说就是Win10+),这个我短时间没实测但是结合驱动来说大概率跑不掉;

5.使用DDA的话由于显存的预先分配也涉及到共享显存(这里就不深究了反正涉及到内存)所以比如动态内存、检查点、自动停止操作等一律禁用,至于CPU数量和内存分配——建议4C/8G起步吧……

6.还是说到MMIO,LowMemoryMappedIoSpace基本设置128MB或者1Gb没什么问题,甚至可能更低到64MB也可以(但是我没有实测,估计类似核显的预分配显存一样),对应的HighMemoryMappedIoSpace看不少人直接分到了32G,这个见仁见智吧,还是拿核显举例,这个估计类似最大可用显存(也依旧没有实测),如果SurveyDDA.ps1有数据反馈的话可以结合巨硬的文档(见上)计算,如果和我一样没有反馈只是甩一句Old-style PCI device, switch port, etc. Not assignable.就只能和我一样结合实际去蒙一把了。

7.Code 43,老黄这边其实目前最新的驱动都已经开放了,路边社消息是可以1分4也没有问题(我也没有实测……再说还是那句730这个GPU劈开这么多刀还怎么用啊你当我3090呢?),至少目前是不用打虚拟机标识隐藏补丁去骗去偷袭驱动了。

8.传说有比如Easy-GPU-PV之类的脚本,但是我觉得有时候还是得自己造下轮子的,再说比如我这种老古董设备大概那个脚本也救不了我。

最后的最后的最后(……)放个图: 左边Windows 11的虚拟机,右边Windows Server 2022的物理机。 硬件嘛,还是我那熟悉的编号Roselia的R410,nVIDIA GK208的730,就酱。

EOF



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有